#include <iostream>
#include <cerrno>
#include <cstring>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>

void* threadRoutine(void* args)
{
    std::cout << (char*)args << std::endl;
    int fd = open("file1.txt", O_RDONLY);
    if(fd < 0)
    {
        std::cout << (char*)args << ", errno:" << strerror(errno) << std::endl;
    }
    
    pthread_detach(pthread_self());
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRoutine, (char*)"thread 1");

    sleep(1);
    
    std::cout << "main thread, errno:" << strerror(errno) << std::endl;

    return 0;
}


// -----------------------------------------------------------------------------------------------------------

// 在某一个线程中进行程序替换，那么整个进程都会被替换掉
// 程序替换，都是替换的进程，不可能单独对某个线程进行替换

// void* threadRoutine2(void* args)
// {
//     std::cout << (char*)args << std::endl;
//     execl("/bin/ls", "ls", nullptr);
//     std::cout << "thread run here ... ..." << std::endl;
//     return nullptr;
// }

// void* threadRoutine1(void* args)
// {
//     std::cout << (char*)args << std::endl;
//     int count = 10;
//     while(count--)
//     {
//         std::cout << (char*)args << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid1, tid2;

//     // 创建线程1，内部执行10s的while循环
//     pthread_create(&tid1, nullptr, threadRoutine1, (void*)"thread 1");

//     for(int i = 0; i < 3; ++i)
//     {
//         std::cout << "main thread" << std::endl;
//         sleep(1);
//     }

//     // 创建线程2，内部执行程序替换
//     pthread_create(&tid2, nullptr, threadRoutine2, (void*)"thread 2");

//     sleep(5);
//     std::cout << "MAIN THREAD RUN HERE ... ..." << std::endl;

//     return 0;
// }


// -----------------------------------------------------------------------------------------------------------

// 线程等待函数 -- pthread_join(pthread tid, void** ret)
// pthread_exit() -- 线程退出函数
// pthread_self() -- 获取线程自身tid
// pthread_cancel(thread tid) -- 通过指定线程id来取消特定的线程，被取消的线程返回-1

// pthread_detach(thread tid) -- 线程分离，一般都是线程将其自身分离出去


// 注意如果在某个线程中使用exit，那么整个进程都会退出
// 如果一个线程出现异常，那么整个进程都会退出

// void* start_routine(void* args)
// {
//     std::cout << (char*)args << std::endl;
//     printf("tid:%ld 0X%X\n", pthread_self(), pthread_self());

//     // 线程可以取消自身，但一般不推荐
//     // 一般由主线程来取消子线程
//     // pthread_cancel(pthread_self());

//     pthread_detach(pthread_self());   // 分离当前线程

//     sleep(10);

//     std::cout << (char*)args << ", run here ... ... " << std::endl;

//     //pthread_exit((void*)13);

//     // int *pa = new int[5];
//     // for(int i = 0; i < 5; ++i)
//     // {
//     //     pa[i] = i;
//     // }

//     // // 线程中申请的资源，可通过返回值，交给主线程
//     // return (void*)pa;

//     // int count = 0;
//     // while(true)
//     // {
//     //     std::cout << (char*)args << ", thread run ..." << std::endl;
//     //     ++count;
//     //     if(count == 5) break;
//     //     sleep(1);
//     // }
    
//     return (void*)20;
// }

// int main()
// {
//     pthread_t tid;
    
//     // 创建线程
//     pthread_create(&tid, nullptr, start_routine, (void*)"thread 1");
    
//     for(int i = 0; i < 3; ++i)
//     {
//         std::cout << "main thread ... ..." << std::endl;
//         sleep(1);
//     }

//     // pthread_cancel(tid);

//     // 等待线程
//     // 二级指针&ret用于获取子线程函数的返回值
//     // 主线程只能阻塞等待子线程，无法实现类似进程的非阻塞等等
//     int *ret = nullptr;
//     int n = pthread_join(tid, (void**)&ret);  

//     if(n == 1)
//     {
//         std::cout << "thread exit, ret:" << (long long)ret << std::endl;
//     }
//     else
//     {
//         std::cout << "wait thread wrong, n:" << n << ", error:" << strerror(n) << std::endl;
//     }
    

//     // for(int i = 0; i < 5; ++i)
//     // {
//     //     std::cout << ret[i] << " ";
//     // }
//     // std::cout << std::endl;

//     // std::cout << "thread exit, ret:" << (long long)ret << std::endl;

//     return 0;
// }


// -----------------------------------------------------------------------------------------------

// 线程的创建demo
// 函数：pthread_create
// void* start_routine1(void* args)
// {
//     while(true)
//     {
//         std::cout << (char*)args << ", thread run ..." << std::endl;
//         sleep(1);
//     }

//     return nullptr;
// }

// void* start_routine2(void* args)
// {
//     while(true)
//     {
//         std::cout << (char*)args << ", thread run ..." << std::endl;
//         sleep(1);

//         // 一个线程出现异常，整个进程都会退出

//         // 除零错误
//         // int a = 10;
//         // a /= 0;

//         // 空指针错误（越界访问）
//         // int* pa = nullptr;
//         // *pa = 10;
//     }

//     return nullptr;
// }


// int main()
// {
//     pthread_t tid1, tid2;

//     // 创建线程1
//     pthread_create(&tid1, nullptr, start_routine1, (void*)"thread 1");

//     // 创建线程2
//     pthread_create(&tid2, nullptr, start_routine2, (void*)"thread 2");

//     // 主线程
//     while(true)
//     {
//         std::cout << "main thread run ... " << std::endl;
//         sleep(1);
//     }

//     return 0;
// }